home *** CD-ROM | disk | FTP | other *** search
-
- ========================================================================
- Just4Fun Productions presents:
-
- Part 4 of: the Techtutor
- (Topics never covered)
-
-
- Collisions
- ========================================================================
-
- Introduction
- ============-
-
- This time we'll take about collisions. There are multiple types of
- collisions, but the one we'll talk about here is the collision between 2
- sprites. First of all some explanation about a few words I'm going to use:
- * raw-edge = the edge of the complete shape (rectangle)
- * real-edge = the actual "edge" of the image.
- so if the image would be a circle the raw-edge would still be a cube that
- surounds the image (the sprite), and the real-edge would be the circle edges
- it self...
-
- ----------------------------------------------------------------
- For contacting Just4Fun or me (PeeBee) use the following ways:
-
- Internet : http://people.zeelandnet.nl/rpb
- Email : just4fun@zeelandnet.nl
-
- SnailMail: P.Bestebroer
- Anthony Edenlaan 28
- 4463 JC Goes (Zld.)
- Holland
-
- ICQ : 2309110 (probably fastest way to contact me)
- ----------------------------------------------------------------
-
- How to do it
- ============-
-
- Collision detection in games is one of the most important things to get
- right, because you don't want the player to get hit while there's no
- alien actually touching him... on the other side you don't want the player
- to be able to go "thru" another object. There are a few ways of collision
- detection, but not all of them are very effective in terms of speed, and
- pixel-perfection. A good collision detection would check on all the real-
- edge pixels of an image, but that would be very S-L-O-W! Just think about
- it, if you would use 32x32 sprite-images, and you had about 50 sprites on
- screen, you would have to check 51200 pixels, that's allmost a complete
- screen! ofcourse this could be done faster by adding some extra image
- information about where the real-edges are, but it would still be very slow
- to check it completely.
-
- Another way of checking is a little bit more math-coordinated, you could
- make some triangles, or maybe even rectangled areas that "surround" the
- sprites real-edge, this is medium-fast, and medium-perfect so it might be
- worth checking into that...BUT we need speed! so,
-
- The fast way
- ============-
-
- A faster way is not as pixel-perfect as should, but close enough to
- fool the player. The fast way would be to check on collision inside of the
- raw-edge only. This is fast enough because you'll only have to check on 4
- co"rdinates per sprite. Ofcourse this isn't that perfect because
- you'r image's may not be completely filled to the raw-edge. For a more
- effective working of this idea, you'll have to draw you'r real-edges as
- close to the raw-edges as possible, leaving a minimum of "empty-ness" at the
- edge of the images. Those few bytes that are empty, won't get in the way of
- the gameplay because the player won't see it, and doesn't know about it!
- And you could also make the collision-rectangle a bit smaller then the true
- sprite-rectangle (leaving some pixels for player-errors).
-
- Examples
- ========-
-
- No example file is attached, but I'll give a simple collision detection
- function here:
-
- {
- Rough check if 2 shapes are colliding. This works faster as a
- pixel by pixel check for a collision, and as long as the shapes don't
- have to much "space" on the edges the collision will be allmost
- perfect.
-
- Expects: X+Y position and the WIDTH + HEIGHT of the first sprite,
- X+Y position and the WIDTH + HEIGHT of the second sprite.
-
- Returns: True if collision has been detected.
- }
- FUNCTION collision(x1,y1,w1,h1, x2,y2,w2,h2 :integer):boolean;
- VAR xd,yd : boolean;
- BEGIN
- ASM
- mov xd,false
- mov yd,false
- END;
- if ((x1 <=x2) and (x1+w1>=x2)) then xd:=true else
- if ((x1 <=x2+w2) and (x1+w1>=x2+w2)) then xd:=true else
- if ((x1 >=x2) and (x1+w1<=x2+w2)) then xd:=true;
- if ((y1 <=y2) and (y1+h1>=y2)) then yd:=true else
- if ((y1 <=y2+h2) and (y1+h1>=y2+h2)) then yd:=true else
- if ((y1 >=y2) and (y1+h1<=y2+h2)) then yd:=true;
- collision:=xd and yd;
- END;
-
-
- Final word
- ==========-
-
- The example shown above was taken from my SuperFX Engine, it work's
- fine and it looks like a pixel-perfect collision detection.
-
- Well that's it for now, The next topic is brand new, and is also new for on
- the web-site, so keep reading for:
-
- Next Tech topic: Demo recording/playing
-
-
- PeeBee - September 10th '97
-